"""
@Time : 2024/1/13 15:37
@Auth : Mr.Zhao
#Function : 
"""
# coding:utf8

import os
from common.Logging import logger
import pymysql
import yaml
from common.all_path import path


class Mysql:
    # 处理.sql备份文件为SQL语句
    def __read_sql_file(self,file_path):
        # 打开SQL文件到f
        logger.debug(f"打开文件f{file_path}")
        sql_list = []
        with open(file_path, 'r', encoding='utf8') as f:
            # 逐行读取和处理SQL文件
            for line in f.readlines():
                # 如果是配置数据库的SQL语句，就去掉末尾的换行
                if line.startswith('SET'):
                    sql_list.append(line.replace('\n', ''))
                # 如果是删除表的语句，则改成删除表中的数据
                elif line.startswith('DROP'):
                    sql_list.append(line.replace('DROP', 'TRUNCATE').replace(' IF EXISTS', '').replace('\n', ''))
                # 如果是插入语句，也删除末尾的换行
                elif line.startswith('INSERT'):
                    sql_list.append(line.replace('\n', ''))
                #删除
                elif line.startswith('DELETE'):
                    sql_list.append(line.replace('\n', ''))
                #查找
                elif line.startswith('SELECT'):
                    sql_list.append(line.replace('\n', ''))

                # 如果是其他语句，就忽略
                else:
                    pass
        logger.debug(f'读取的sql语句为{sql_list}')
        return sql_list

    # 初始化mysql配置
    def init_mysql(self,path:str = path):
        #检查指定路径下是否存在名为"lib/conf.yaml"的文件。如果该文件不存在，它会将路径变量path的值更改为'../'。
        #logger.info(path)
        if not os.path.isfile(path + "lib\\conf.yml"):
            logger.warning(f'{path} + lib\\conf.yml 文件不存在')
            assert(False)
            #path = '../'

        # 读取配置文件
        with open(file=path + "lib\\conf.yml", mode='r', encoding="utf-8")as file:
            self.conf = yaml.safe_load(stream=file).get('mysql')
        # print(f'类型是{type(self.conf)}')
        # print(self.conf)
        self.sqlpath = path + self.conf['sqlpath']
        self.conf.pop('sqlpath') #connect连接的时候不要sqlpath参数，所以这里用完后删除
        # 创建连接，执行语句的时候是在这个连接上执行
        connect = pymysql.connect(**self.conf)

        # 获取游标（可以理解为指针）
        self.cursor = connect.cursor()
        logger.info("正在恢复%s数据库" % self.sqlpath)
        # 一行一行执行SQL语句
        for sql in self.__read_sql_file(self.sqlpath):
            logger.info(sql)
            self.cursor.execute(sql)
            #如果是查询语句，则返回查询结果
            if(sql.startswith('SELECT')):
                logger.info(self.cursor.fetchall())
            connect.commit()

        # cursor.execute('select * from userinfo where username = "Will";')
        # print(cursor.description)
        # res = cursor.fetchall()
        # print(res)

        # 关闭游标和连接
        self.cursor.close()
        connect.close()


# 调试代码
if __name__ == '__main__':
    mysql = Mysql()
    mysql.init_mysql()